package com.ychen.ruijee.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ychen.ruijee.bean.User;
import com.ychen.ruijee.common.R;
import com.ychen.ruijee.dao.UserDao;
import com.ychen.ruijee.service.UserService;
import com.ychen.ruijee.utils.ValidateCodeUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import javax.servlet.http.HttpSession;
import java.util.Map;
import java.util.concurrent.TimeUnit;


/**
 * @author ychen@gotop.cn
 * @date 2024-06-05 23:38
 */
@Slf4j
@Service
public class UserServiceImpl extends ServiceImpl<UserDao, User> implements UserService {

    @Resource
    private RedisTemplate redisTemplate;


    /**
     * 生成验证码信息
     *
     * @param user
     * @param session
     * @return
     */
    @Override
    public R<String> sendMsg(User user, HttpSession session) {
        String phone = user.getPhone();
        if(StringUtils.isNotEmpty(phone)){
            // 调用工具类 随机地生成 4位 验证码
            String code = ValidateCodeUtils.generateValidateCode(4).toString();
            log.info("生成的【验证码】信息为；{}",code);

            // 将生成的验证码信息保存到 Session 中 key-valeu 的形式
            /*session.setAttribute(phone,code);
            return code;*/

            //  优化 将生成的 验证码存放在 redis当中
            redisTemplate.opsForValue().set(phone,code,1, TimeUnit.MINUTES);
            return R.success(code);
        }
        return R.error("验证码发送失败");
    }

    /**
     * 移动端 用户登录
     *
     * @param map
     * @param session
     * @return
     */
    @Override
    public User userLogin(Map map, HttpSession session) {
        log.info("【Map中的信息为：{}】",map.toString());
        // 获取手机号 获取验证码
        String phone = map.get("phone").toString();
        String code = map.get("code").toString();
        // 获取验证码的是 将 phone-validateCode 已 key-value的形式 存放在 session中
        //Object validateCode = session.getAttribute(phone);
        // 优化 登录的时候 根据手机号去 redis中取  验证码
        Object codeInRedis = redisTemplate.opsForValue().get(phone);

         User user = new User();

        // 进行验证码的比对
        if(codeInRedis != null && code.equals(codeInRedis)){
            // 通过手机号 去数据库中查询
            LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
            wrapper.eq(User::getPhone,phone);
            user = this.getOne(wrapper);

            // 判断数据库中存不存在该用户 不存在 则为新用户 自动完成注册
            if(user == null){
                user = new User();
                user.setName("u_"+phone);
                user.setPhone(phone);
                user.setStatus(1);
                boolean save = this.save(user);

            }
            // 将 userId 放入到 session中
            session.setAttribute("user",user.getId());
            // 登录成功  删除redis中的 验证码
            redisTemplate.delete(phone);
        }
        return user;
    }
}
